package org.webflux.provider.repository;


import lombok.extern.slf4j.Slf4j;
import org.webflux.provider.pojo.User;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;

@Slf4j
// 模拟响应式MongoDB Repository
public class UserRepository {

    // 模拟数据库中的数据
    private static final List<User> USERS = new ArrayList<>();

    static {
        // 初始化一些测试数据
        USERS.add(new User("1", "Alice", 25));
        USERS.add(new User("2", "Bob", 30));
        USERS.add(new User("3", "Charlie", 35));
        USERS.add(new User("4", "David", 40));
        USERS.add(new User("5", "Eve", 45));
    }

    // 模拟根据ID查询（返回单个结果）
    public Mono<User> findById(String id) {
        // 模拟数据库查询的延迟（500ms）
        return Mono.justOrEmpty(USERS.stream()
                        .filter(user -> user.getId().equals(id))
                        .findFirst())
                .delayElement(Duration.ofMillis(500));
    }

    // 模拟查询所有用户（返回多个结果）
    public Flux<User> findAll() {
        // 模拟流式返回，每个元素间隔200ms
        return Flux.fromIterable(USERS)
                .delayElements(Duration.ofMillis(200));
    }

    // 模拟根据年龄查询（返回多个结果）
    public Mono<String> addUser(Mono<User> user) {
        // 模拟数据库插入的延迟（500ms）
        try {
            Thread.sleep(500);
            log.info("add user:{}",user);

        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        log.info("add user:{}",user);
        USERS.add(user.block());
        return Mono.just("success")
                .delayElement(Duration.ofMillis(1000));
    }
}